#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "Key.h"
#include "AS608.h"
#include "uart2.h"
#include "fpr_do.h"
#include "duoji.h"
#include "dianya.h"
#include "Buzzer.h"
#include "fpr_wakeup.h"
#include "public.h"

/*
中断优先级说明：
串    口：0，1
指    纹：1，1（一直生效）
定时中断：2，1
按键中断：2，2（唤醒后被配置为普通IO口）
*/


uint8_t KeyNum;			//定义用于接收按键键码的变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	Key_Init();			//按键初始化
	Serial_Init();		//串口初始化
	Serial_Init2();		//串口2初始化
	duoji_init();		//舵机初始化（pwm）
	dianya_Init();		//电压初始化
	Buzzer_Init();		//蜂鸣器初始化
	fpr_wakeup_Init();	//指纹唤醒初始化
	
	/*IWDG初始化*/
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	//独立看门狗写使能
	IWDG_SetPrescaler(IWDG_Prescaler_256);		//设置预分频为256,最长喂狗时间为26214.4ms（即26秒左右）
	IWDG_SetReload(4095);						//设置重装值为4095，独立看门狗的超时时间为26214.4ms
	IWDG_ReloadCounter();						//重装计数器，喂狗
	IWDG_Enable();								//独立看门狗使能
	
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "TxPacket");
	OLED_ShowString(3, 1, "RxPacket");
	Serial_Printf2("nihao\n");
//	if(fpr_get_num()==0x00)
//	{
//		Serial_Printf2("ValidN is %d",ValidN);
//	}
	while (1)
	{

		fpr_search();
		IWDG_ReloadCounter();	//重装计数器，喂狗（加入看门狗功能，避免程序跑死）
		KeyNum = Key_GetNum();			//获取按键键码
		Serial_Printf2("KeyNum is %d\n",KeyNum);
		if (KeyNum == 1)				//按键1按下
		{
			Serial_Printf2("I am coming555555\n");
			u8 return_data = fpr_add(200);
			if(return_data==0x00)		//如果录入成功
			{
				Serial_Printf2("fpr_add is ok\n");
				reply_data[8]=0;
			}
			Serial_Printf2("HexNum is %d\n",return_data);
		}
//		Serial_Printf2("AD is %d\n",AD_GetValue());
		Serial_Printf2("dianya is %.2f\n",dianya_GetValue());
		OLED_ShowHexNum(2,1,reply_data[9],4);

	}
}
/*
函  数：定时器4中断函数，20ms进一次中断
参  数：无
返回值：无
*/
void TIM4_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
	{
		
		/*蜂鸣器控制*/
		switch(Buzzer_states){
			case 0:	//默认关闭
				Buzzer_time=0;	//Buzzer响的时长清零
				Buzzer_OFF();
				break;
			case 1:	//成功
				Buzzer_ok();
				break;
			case 2:	//失败
				Buzzer_fail();
				break;
			case 3:	//按键音
				Buzzer_key();
				break;
			case 4:	//电量低
				Buzzer_battery();
				break;
		}
		switch(duoji_status){
			case 0:
				duoji_time=0;			//舵机时间控制变量清零
				duoji_SetAngle(0);		//没有舵机动作时舵机维持在0度
				break;
			case 1:
				duoji_time ++;
				if(duoji_time<=50)		//1秒内将舵机角度移动到90度
				{
					duoji_SetAngle(90);		//有舵机动作时，舵机移动到90度
				}
				else if(duoji_time<=125)	//舵机维持此90度1.5秒
				{
					
				}
				else if(duoji_time<=175)	//1秒来恢复原来位置，以便关门
				{
					duoji_SetAngle(0);		//舵机移动到0度
					if(duoji_time==150)
					{
						duoji_time = 0;			//舵机时间控制变量清零
						duoji_status = 0;		//舵机模式变为0
					}
				}
				break;
		}
		
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
	}
}
